<?php

namespace CHOMP\CRUDSGIBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity(repositoryClass="CHOMP\CRUDSGIBundle\Entity\UsuarioRepository")
 * @ORM\Table(name="usuario")
 * @UniqueEntity(
 *		fields = "login",
 *		message = "Login existente. Elija un nuevo login."
 *		)
 * @UniqueEntity(
 *		fields = "email",
 *		message = "Email existente. Elija un nuevo email."
 *		)
 */
class Usuario
{
    /**
	 * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=16, nullable=false, unique=true)
	 * @Assert\NotBlank(
	 *       message = "El login no puede estar vacío."
	 *		)
	 * @Assert\Length(
     *      min = "8",
     *      max = "16",
	 *      minMessage = "El nombre debe tener al menos {{ limit }} caracteres.",
     *      maxMessage = "El nombre debe tener {{ limit }} caracteres como máximo."
	 *		)
     */
    protected $login;

    /**
     * @ORM\Column(type="string", length=30, nullable=false)
	 * @Assert\NotBlank(
	 *       message = "El nombre no puede estar vacío."
	 *		)
	 * @Assert\Length(
     *      min = "4",
     *      max = "30",
	 *      minMessage = "El nombre debe tener al menos {{ limit }} caracteres.",
     *      maxMessage = "El nombre debe tener {{ limit }} caracteres como máximo."
	 *		)
     */
    protected $nombre;

    /**
     * @ORM\Column(type="string", length=30, nullable=false)
	 * @Assert\NotBlank(
	 *       message = "El apellido no puede estar vacío."
	 *		)
	 * @Assert\Length(
     *      min = "4",
     *      max = "30",
	 *      minMessage = "El nombre debe tener al menos {{ limit }} caracteres.",
     *      maxMessage = "El nombre debe tener {{ limit }} caracteres como máximo."
	 *		)
     */
    protected $apellido;

    /**
     * @ORM\Column(type="string", length=50, nullable=false, unique=true)
	 * @Assert\NotBlank(
	 *       message = "El nombre no puede estar vacío."
	 *		)
     * @Assert\Email(
     *     message = "El email '{{ value }}' no es válido."
     *      )
	 * @Assert\Length(
     *      min = "5",
     *      max = "50",
	 *      minMessage = "El nombre debe tener al menos {{ limit }} caracteres.",
     *      maxMessage = "El nombre debe tener {{ limit }} caracteres como máximo."
	 *		)
     */
    protected $email;

    /**
     * @ORM\Column(type="string", length=16, nullable=false)
	 * @Assert\NotBlank(
	 *       message = "El password no puede estar vacío."
	 *		)
	 * @Assert\Length(
     *      min = "8",
     *      max = "16",
	 *      minMessage = "El nombre debe tener al menos {{ limit }} caracteres.",
     *      maxMessage = "El nombre debe tener {{ limit }} caracteres como máximo."
	 *		)
     */
    protected $password;

    /**
     * @ORM\Column(type="date", nullable=false)
	 * @Assert\NotNull(message = "El campo no puede estar en blanco.")
     */
    protected $passwordExpiryDate;

    /**
     * @ORM\Column(type="boolean", nullable=false)
	 * @Assert\NotNull(message = "El campo no puede estar en blanco.")
	 * @Assert\Choice(choices = {true, false}, message = "Elija un valor.")
	 */
    protected $borrado;

    /**
	 * Hay que definir cuáles son estos posible estados y si vienen de otra tabla o no. No es booleano (activo, inactivo, lockeado, borrado, expirado)
     * @ORM\Column(type="boolean", nullable=false)
     */
    protected $estado;

	/**
	 * Esto es relativo. Un usurio pertenece a una empresa si es un usuariocliente. Se puede también usar para reconocer los usuarios de soporte, pero es feo.
	 * @ORM\ManyToOne(targetEntity="Empresa", inversedBy="usuarios")
	 * @ORM\JoinColumn(name="empresa_id", referencedColumnName="id", nullable=false)
	 * @Assert\NotNull(message = "El campo no puede estar en blanco.")
	 */
	protected $empresa;
	
	/**
	 * Usuario es inverse side en la many to many con GrupoSoporte.
     * @ORM\ManyToMany(targetEntity="GrupoSoporte", mappedBy="usuarios")
	 * @ORM\JoinColumn(name="gruposoporte_id", referencedColumnName="id", nullable=true)
     **/
    protected $gruposSoporte;

	/**
     * @ORM\OneToMany(targetEntity="Timesheet", mappedBy="usuario")
	 * @ORM\JoinColumn(name="timesheet_id", referencedColumnName="id", nullable=true)
     **/
    protected $timesheets;

	
	
	/**********************************
     * __construct
     *
     * 
     **********************************/	
    public function __construct() 
	{
        $this->gruposSoporte = new ArrayCollection();
		$this->timesheets = new ArrayCollection();
    }

	/**********************************
     * __toString()
     *
     * Este método sirve para poder popular los comboboxes en los forms.
     *********************************/ 
    public function __toString()
	{
		return $this->getLogin();
	}
	
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nombre
     *
     * @param string $nombre
     * @return Usuario
     */
    public function setNombre($nombre)
    {
        $this->nombre = $nombre;
    
        return $this;
    }

    /**
     * Get nombre
     *
     * @return string 
     */
    public function getNombre()
    {
        return $this->nombre;
    }

    /**
     * Set apellido
     *
     * @param string $apellido
     * @return Usuario
     */
    public function setApellido($apellido)
    {
        $this->apellido = $apellido;
    
        return $this;
    }

    /**
     * Get apellido
     *
     * @return string 
     */
    public function getApellido()
    {
        return $this->apellido;
    }

    /**
     * Set email
     *
     * @param string $email
     * @return Usuario
     */
    public function setEmail($email)
    {
        $this->email = $email;
    
        return $this;
    }

    /**
     * Get email
     *
     * @return string 
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * Set password
     *
     * @param string $password
     * @return Usuario
     */
    public function setPassword($password)
    {
        $this->password = $password;
    
        return $this;
    }

    /**
     * Get password
     *
     * @return string 
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * Set borrado
     *
     * @param boolean $borrado
     * @return Usuario
     */
    public function setBorrado($borrado)
    {
        $this->borrado = $borrado;
    
        return $this;
    }

    /**
     * Get borrado
     *
     * @return boolean 
     */
    public function getBorrado()
    {
        return $this->borrado;
    }

    /**
     * Set estado
     *
     * @param string $estado
     * @return Usuario
     */
    public function setEstado($estado)
    {
        $this->estado = $estado;
    
        return $this;
    }

    /**
     * Get estado
     *
     * @return string 
     */
    public function getEstado()
    {
        return $this->estado;
    }

    /**
     * Set empresa
     *
     * @param \CHOMP\CRUDSGIBundle\Entity\Empresa $empresa
     * @return Usuario
     */
    public function setEmpresa(\CHOMP\CRUDSGIBundle\Entity\Empresa $empresa = null)
    {
        $this->empresa = $empresa;
    
        return $this;
    }

    /**
     * Get empresa
     *
     * @return \CHOMP\CRUDSGIBundle\Entity\Empresa 
     */
    public function getEmpresa()
    {
        return $this->empresa;
    }

    /**
     * Add gruposSoporte
     *
     * @param \CHOMP\CRUDSGIBundle\Entity\GrupoSoporte $gruposSoporte
     * @return Usuario
     */
    public function addGruposSoporte(\CHOMP\CRUDSGIBundle\Entity\GrupoSoporte $gruposSoporte)
    {
        $this->gruposSoporte[] = $gruposSoporte;
    
        return $this;
    }

    /**
     * Remove gruposSoporte
     *
     * @param \CHOMP\CRUDSGIBundle\Entity\GrupoSoporte $gruposSoporte
     */
    public function removeGruposSoporte(\CHOMP\CRUDSGIBundle\Entity\GrupoSoporte $gruposSoporte)
    {
        $this->gruposSoporte->removeElement($gruposSoporte);
    }

    /**
     * Get gruposSoporte
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getGruposSoporte()
    {
        return $this->gruposSoporte;
    }
	
    /**
     * Add timesheets
     *
     * @param \CHOMP\CRUDSGIBundle\Entity\Timesheet $timesheets
     * @return Usuario
     */
    public function addTimesheet(\CHOMP\CRUDSGIBundle\Entity\Timesheet $timesheets)
    {
        $this->timesheets[] = $timesheets;
    
        return $this;
    }

    /**
     * Remove timesheets
     *
     * @param \CHOMP\CRUDSGIBundle\Entity\Timesheet $timesheets
     */
    public function removeTimesheet(\CHOMP\CRUDSGIBundle\Entity\Timesheet $timesheets)
    {
        $this->timesheets->removeElement($timesheets);
    }

    /**
     * Get timesheets
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getTimesheets()
    {
        return $this->timesheets;
    }

    /**
     * Set login
     *
     * @param string $login
     * @return Usuario
     */
    public function setLogin($login)
    {
        $this->login = $login;
    
        return $this;
    }

    /**
     * Get login
     *
     * @return string 
     */
    public function getLogin()
    {
        return $this->login;
    }

    /**
     * Set passwordExpiryDate
     *
     * @param \DateTime $passwordExpiryDate
     * @return Usuario
     */
    public function setPasswordExpiryDate($passwordExpiryDate)
    {
        $this->passwordExpiryDate = $passwordExpiryDate;
    
        return $this;
    }

    /**
     * Get passwordExpiryDate
     *
     * @return \DateTime 
     */
    public function getPasswordExpiryDate()
    {
        return $this->passwordExpiryDate;
    }
}